package com.dt.module.om.util;

import com.jcraft.jsch.*;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class FileTransfer {
    public static void scp(String userA,String hostA,String passwordA,int portA,String fileRemotePath,
                           String userB,String hostB,String passwordB,int portB,String fileUploadPath) {
        String remotePathB = fileRemotePath; // Linux B上传输文件的远程路径
        String localPathA = fileUploadPath; // Linux A上要传输的文件路径
        try {
            // 创建SSH连接
            JSch jsch = new JSch();
            Session sessionA = jsch.getSession(userA, hostA, portA);
            sessionA.setDaemonThread(true);
            sessionA.setPassword(passwordA);
            sessionA.setConfig("StrictHostKeyChecking", "no"); // 跳过验证主机密钥，仅用于测试环境
            sessionA.connect();
            sessionA.setDaemonThread(true);
            sessionA.setTimeout(60000);
            ChannelSftp channelA = (ChannelSftp) sessionA.openChannel("sftp");
            channelA.connect();
            // 从主机A获取文件
            String remoteFilePath = remotePathB; // 主机A上的文件路径
            InputStream inputStream = channelA.get(remoteFilePath);
            System.out.println("开始传输文件：" + remoteFilePath); // 打印开始传输文件消息
            // 创建到主机B的SSH连接
            Session sessionB = jsch.getSession(userB, hostB, portB);
            sessionB.setPassword(passwordB);
            sessionB.setConfig("StrictHostKeyChecking", "no"); // 跳过验证主机密钥，仅用于测试环境
            sessionB.setTimeout(60000);
            sessionB.setDaemonThread(true);
            sessionB.connect();
            ChannelSftp channelB = (ChannelSftp) sessionB.openChannel("sftp");
            channelB.connect();
            // 将文件上传到主机B
            String localFilePath = localPathA; // 主机B上的文件路径（可以是临时文件）
            OutputStream outputStream = channelB.put(localFilePath);
            byte[] buffer = new byte[4096];
            int bytesRead;
            long totalBytes = channelA.lstat(remoteFilePath).getSize(); // 获取文件总字节数
            System.out.println("文件路径:"+remotePathB);
            System.out.println("文件大小:"+totalBytes/1024/1024);
            long transferredBytes = 0; // 记录已传输的字节数
            long startTime = System.nanoTime(); // 记录传输开始时间（纳秒）
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
                transferredBytes += bytesRead; // 更新已传输的字节数
                long elapsedTime = System.nanoTime() - startTime; // 计算已用时间（纳秒）
                double transferRate = ((double)transferredBytes) / (elapsedTime / 1000); // 计算当前的传输速率（MB/s）
                int progress = (int)((transferredBytes / (float) totalBytes) * 100); // 计算传输进度百分比
                System.out.println("传输进度:" + progress + "%,传输速率:" + transferRate + "MB/s"); // 打印传输速率消息
            }
            inputStream.close();
            outputStream.close();
            long endTime = System.nanoTime(); // 记录传输结束时间（纳秒）
            long timeElapsed = endTime - startTime; // 计算传输时间（纳秒）
            double transferRate = (double)transferredBytes / (timeElapsed / 1000); // 计算传输速率（MB/s）
            channelB.disconnect(); // 断开与主机B的连接
            sessionB.disconnect(); // 断开与主机B的SSH连接
            channelA.disconnect();
            sessionA.disconnect();
            System.out.println("文件传输完成:" + localFilePath+",传输速率:" + transferRate + "MB/s"); // 打印文件传输完成消息

        } catch (JSchException e) {
            e.printStackTrace();
        } catch (SftpException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



